#ifndef _WRAPIREQUESTER_H_
#define _WRAPIREQUESTER_H_

#include "CategoryBlock.h"
#include <QNetworkAccessManager>
#include <QUrl>
#include <QObject>
#include <QString>

class QTemporaryFile;
class QNetworkReply;
class QXmlStreamWriter;
class QSettings;
class Term;

/**
 */
class WRApiRequester : public QObject
{
	Q_OBJECT
public:
	/// Constructor
	WRApiRequester(const QString& word, QSettings* settings);

	/// Destructor
	~WRApiRequester();

	/// Metodo que lanza una petición POST a una URL y espera su respuesta
	void startRequest();

	/// Método que vuelca por pantalla la traducción
	void dump(QXmlStreamWriter& writer);

	/// Método que indica si se ha producido algún tipo de error
	bool hasError()
		{ return _error; }

	/// Método que devuelve la cadena con el error
	QString getErrorString()
		{ return _errorString; }

private slots:
	/**
	 * Slot que se va a llamar cuando hayamos terminado de recibir la respuesta de nuestra peticion HTTP
	 */
	void httpFinished();

	/**
	 * Slot que se va a llamar cada vez que el QNetworkReply tenga nuevos datos.
	 * Leemos todos los datos recibidos y los escribimos en el archivo.
	 * De esta manera consumimos menos memoria que si lo leemos de golpe cuando se
	 * emita la señal finished() del QNetworkReply
	 */
	void httpReadyRead();

private:
	/// Método que parsea la respuesta recibida en formato JSON
	bool parseResponseJSON();

	QString _word; ///< Palabra que vamos a traducir
	QSettings* _settings;
	QUrl _url; ///< URL de la petición
	QNetworkAccessManager _qnam; ///< Para enviar la peticion y recibir la respuesta
	QNetworkReply *_reply; ///< Para leer la respuestas al POST
	QTemporaryFile *_responseFile; ///< Archivo temporal donde iremos guardando los datos recibidos de la respuesta
	bool _error;
	QString _errorString;

	QHash<int, Term*> _terms; ///< Hash con los distintos términos
	CategoryBlock *_compounds;

signals:
	// Señal que emitiremos cuando hayamos terminado de recibir la respuesta a nuestra petición
	void done();
};

#endif // _WRAPIREQUESTER_H_

